בכנס המפתחים NDC 2013 שעבר בתחילת החודש בלונדון, מדס טורגנסן (Mads Torgensen), אחד המעצבים של C# וחבר בקבוצת TypeScript, הציג בהרצאה שלו "The Future of C#" את החידושים שכנראה צפויים לנו בגרסאות הבאות של השפה.
Primary Constructor
הרבה פעמים הפעולה היחידה שהבנאי עושה היא הצבה של פרמטרים לתוך מאפיינים של המחלקה. primary constructor שנראה כמו בנאי רגיל לחלוטין, ייצור ויציב בעצמו ערכים לתוך מאפיינים עם שם זהה במחלקה. אגב, מבנה זהה קיים גם ב-Scala.
בנאי רגיל
public class Point
{
private int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
{
private int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
בנאי ראשי
public class Point(int x, int y)
{
}
{
}
Auto readonly properties
אם היום משתמשים ב-property עם setter פרטי
public int X { get; private set;}
או בשדה readonly
private readonly int x;
public int X { get { return x; } }
public int X { get { return x; } }
מעכשיו יהיה ניתן פשוט לכתוב
public int X { get; } = 42;
Property Expressions && Method Expressions
הגדרה של property ושל מתודות בצורת פונקציות אנונימיות:
public double Distance => Math.Sqrt((X * X) + (Y * Y));
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
Params IEnumerable
params יתמכו ב-IEnumerable, מה שיאפשר לחסוך המרה של IEnumerable למערך לפני.
// Istead of
public void Sum(params int[] values) { ... }
Do(someList.ToArray());
// just
public void Do(params IEnumerable<int> values) { ... }
Do(someList)
public void Sum(params int[] values) { ... }
Do(someList.ToArray());
// just
public void Do(params IEnumerable<int> values) { ... }
Do(someList)
ייבוא מתודות סטטיות באמצעות using
באמצעות הפקודה using נוכל לייבא לא רק שמות מרחב, אלה גם מתודות סטטיות מתוך מחלקות, מה שיאפשר להימנע מכתיבת שם המחלקה לפני. שים לב בדוגמה הבאה ששם המחלקה Math לא מופיע לפני שמות המתודות:
using System.Math;
...
public double A { get { return Sqrt(Floor(6.789)); } }
...
public double A { get { return Sqrt(Floor(6.789)); } }
Safe Navigation Operator
אופרטור ?. שיבדוק האם הערך לא null לפני קריאה למתודות או המאפיינים שלו. זהה לשזה שיש ב-Groovy וב-CoffeeScript. לדעתי השימוש העיקרי שלו יהיה עם null coalesce operator, למשל ככה:
var value = list?.FirstOrDefault()?.value ?? -1;
יצירה אוטומטית של משתני out
המשתנה שאנחנו נוהגים להגדיר לפני העברתו למתודה עם out מעכשיו יווצר לבד:
// Was
bool ok;
public Point Jump(int h, out bool ok) { .. }
// Becomes
public Point Jump(int h, out bool ok) { .. }
bool ok;
public Point Jump(int h, out bool ok) { .. }
// Becomes
public Point Jump(int h, out bool ok) { .. }
הסקה אוטומטית של סוג הבנאי במחלקות גנריות
במקרים של מחלקות גנריות המהדר יהיה מסוגל להבין את סוג המחלקה לפי הסוג של הפרמטרים לבנאי, מה שהוא לא יכול לעשות עד עכשיו:
public class MyClass<T>
{
public MyClass(T var)
{
}
}
..
var x = new MyClass(4);
// Can't infer <T> from argument type
// Error 1 Using the generic type 'MyClass<T>' requires 1 type arguments
{
public MyClass(T var)
{
}
}
..
var x = new MyClass(4);
// Can't infer <T> from argument type
// Error 1 Using the generic type 'MyClass<T>' requires 1 type arguments
תגובות לכתבה:
תודה רבה, אלה החידושים העיקריים או היחידים ?
כרגע זה מה שידוע שמתוכנן לגרסה הבאה, c# 6 או מה שזה לא יהיה.
ממ, יש בונוס:
C# 6.0 will feature an all new C#-based compiler based on Roslyn, which will be released with VS 2014. Roslyn is currently available as a community technology preview, which opens up new compiler services for third parties. The C# team aims to make Roslyn as close to the performance of the native compiler as possible (within a factor of 2 during development and better on release), and, in some cases, Roslyn already outperforms the native compiler due to a more modern immutable AST architecture that supports parallel compilation. The immutable AST architecture is detailed in a recently filed patent.